Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Как сделать дерево? (Работа с массивами) (Военный)
Author Message
Военный
Заглянувший



Joined: 20 Feb 2008
Posts: 13
Карма: -1
   поощрить/наказать


PostPosted: Mon Mar 03, 2008 1:42 pm (написано за 6 минут 37 секунд)
   Post subject: Как сделать дерево? (Работа с массивами)
Reply with quote

Вообщем не могу решить задачку. Я её конечно решу, но вдруг есть уже известные алгоритмы решения подобных задач.
Суть - надо из обычного двумерного массива, создать массив со вложенными массивами, дерево.
Итак есть массив:
Code (any language): скопировать код в буфер обмена
Array
(
    [osnova] => Array
        (
            [id] => 1
            [predok] => 0
            [title] => Самый главный
                )
               
    [test1] => Array
        (
            [id] => 2
            [predok] => osnova
            [title] => тест1
            [child] => Array
        )

    [test2] => Array
        (
            [id] => 3
            [predok] => osnova
            [title] => тест2
        )

    [test3] => Array
        (
            [id] => 4
            [predok] => test1
            [title] => тест 3
                           
        )

    [test4] => Array
        (
            [id] => 5
            [predok] => osnova
            [title] => тест4
        )

    [test5] => Array
        (
            [id] => 6
            [predok] => test3
            [title] => тест5
        )

    [test6] => Array
        (
            [id] => 7
            [predok] => test1
            [title] => тест6
        )

)
А надо привести его к виду:
Code (any language): скопировать код в буфер обмена
Array
(
    [osnova] => Array
        (
            [id] => 1
            [predok] => 0
            [title] => Самый главный
            [child] => Array
                (
                    [test1] => Array
                        (
                                             [id] => 2
                                            [predok] => osnova
                                            [title] => тест1
                                            [child] => Array
                                                (
                                                    [test3] => Array
                                                                        (
                                                                            [id] => 4
                                                                            [predok] => test1
                                                                            [title] => тест 3
                                                                            [child] => Array
                                                                                (
                                                                                    [test5] => Array
                                                                                        (
                                                                                            [id] => 6
                                                                                            [predok] => test3
                                                                                            [title] => тест5
                                                                                        )

                                                                                )

                                                                        )

                                                    [test6] => Array
                                                        (
                                                            [id] => 7
                                                            [predok] => test1
                                                            [title] => тест6
                                                        )

                                                )

                                        )

                    [test2] => Array
                        (
                            [id] => 3
                            [predok] => osnova
                            [title] => тест2
                        )

                    [test4] => Array
                        (
                            [id] => 5
                            [predok] => osnova
                            [title] => тест4
                        )

                )

        )

   
)
Может кто-нить натолкнет меня на мысль, как сделать это попроще?
Я пока что делаю так:
Беру первый (главный) элемент и пробегаюсь по массиву, в поисках "детей".
Потом беру первого ребенка и ищу его детей. И так далее.
Но, пока что не могу сообразить, как правильно брать детей (чтоб не повторялись) и как понять, что я перебрал уже весь массив и дерево готово.
Все это конечно элементарно решается при помощи XML, но данная задача стоит именно с массивами.
Back to top
View user's profile Send private message
Iced
Участник форума



Joined: 25 Apr 2007
Posts: 51
Карма: 5
   поощрить/наказать


PostPosted: Mon Mar 03, 2008 3:31 pm (спустя 1 час 49 минут; написано за 2 минуты 45 секунд)
   Post subject:
Reply with quote

Хочется верить, что не всё у военных так делается... :)
А вообще, если по делу, то рекурсией сделать это довольно просто, если хорошо представлять себе что это такое. :)
Ещё возникает вопрос: почему родителя Вы адресуете по имени, а не по id? :)

P.S.
И шутка юмора напоследок:
Для того чтобы понять рекурсию, нужно сначала понять рекурсию ;)
Back to top
View user's profile Send private message
Военный
Заглянувший



Joined: 20 Feb 2008
Posts: 13
Карма: -1
   поощрить/наказать


PostPosted: Mon Mar 03, 2008 4:51 pm (спустя 1 час 19 минут; написано за 15 секунд)
   Post subject:
Reply with quote

Я смотрю Вам очень нравится слово рекурсия - видать тока недавно услышали.
Родителя адресую по имени - для наглядности. id в данном случае чисто как счетчик.

А по теме - совет с рекурсивным вызовом дельный. Дальше действительно все довольно просто.
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Mon Mar 03, 2008 5:46 pm (спустя 55 минут; написано за 2 минуты 21 секунду)
   Post subject:
Reply with quote

После того как я начал использовать AS ARRAY_KEY / AS PARENT_KEY в DbSimple2 (dklab.ru/lib/DbSimple/), желание изобретать велосипеды напрочь отбилось. Там не используется рекурсия.
А рекурсивные алгоритмы — пожалуйста: forum.dklab.ru/search.html?q=%EC%E0%F1%F1%E8%E2+%E4%E5%F0%E5%E2%EE&sort_by=5&nospam=GEN_BY_JS
Back to top
View user's profile Send private message Send e-mail
Военный
Заглянувший



Joined: 20 Feb 2008
Posts: 13
Карма: -1
   поощрить/наказать


PostPosted: Mon Mar 03, 2008 6:03 pm (спустя 16 минут; написано за 4 минуты 48 секунд)
   Post subject:
Reply with quote

Антон Макаренко wrote:
После того как я начал использовать AS ARRAY_KEY / AS PARENT_KEY в DbSimple2 (dklab.ru/lib/DbSimple/), желание изобретать велосипеды напрочь отбилось. Там не используется рекурсия.
Хм, AS ARRAY_KEY я использовал до этого, а вот AS PARENT_KEY - чото не заметил.
Действительно, для решения моей задачки было достаточно добавить в запрос AS PARENT_KEY.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML